from requests.exceptions import RequestException
import requests
import re,time,json

def getPage(url):
    '''爬取指定url页面信息'''
    try:
        #定义请求头信息
        headers = {
            'User-Agent':'User-Agent:Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'
        }
        # 执行爬取
        res = requests.get(url,headers=headers)
        #判断响应状态,并响应爬取内容
        if res.status_code == 200:
            return res.text
        else:
            return None
    except RequestException:
        return None

def download(items_pic):
    '''下载爬取的图片'''
    for link in items_pic:
        # 拼取图片的rul地址
        link = re.sub(re.compile(r'"', re.S), "", link, 0)
        link = 'http:' + link
        print('=======', link)
        # 图片重命名
        filename = r"static/" + str(time.time()) + '.png'
        # requets的方式抓取图片
        img = requests.get(link)
        img.encoding = img.apparent_encoding
        with open(filename, 'wb') as file:
            file.write(img.content)

def parsePage(html):
    print("parsePage")
    # print(html)
    '''解析爬取网页中的内容，并返回字段结果'''
    #定义解析正则表达式 标题、图片、户型、价格
    # pat = '<div class="money">.*?<b class="strongbox">([0-9]+)</b>'
    # pat = 'target="_blank"  rel="nofollow" >(.*?)</a>'
    # 这个是其他的
    pat = 'target="_blank"  rel="nofollow" >(.*?)</a>.*?<p class="room strongbox">(.*?)(?:&nbsp;){4}([0-9]+)㎡</p>'
    pat_pic = '<img.*?lazy_src="(.*?)".*?src=".*?">'
    #执行解析
    items = re.findall(pat,html,re.S)
    items_pic = re.findall(pat_pic, html, re.S)
    download(items_pic)

    # 遍历封装数据并返回
    for item in items:
        # print("="*80)
        yield {
            'title':item[0].strip(),
            'type': item[1],
            'size': item[2],
            'pic':items_pic[0].strip(),
        }

def writeFile(content):
    '''执行文件追加写操作'''
    # print(content)
    with open("./58info.txt",'a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False) + "\n")
        #json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False

def main(offset):
    ''' 主程序函数，负责调度执行爬虫处理 '''
    url = 'https://bj.58.com/dashanzi/chuzu/pn' + str(offset) + '/?ClickID=1'
    html = getPage(url)
    print("main")
    # 判断是否爬取到数据，并调用解析函数
    if html:
        for item in parsePage(html):
            writeFile(item)

# 判断当前执行是否为主程序运行，并遍历调用主函数爬取数据
if __name__ == '__main__':
    # 循环48次对于所有查询的结果页面的数据进行遍历
    for i in range(1,48):
        main(offset=i)
    # 适时的休眠，对于反扒的基本伪装
    time.sleep(5)
